home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / mail / pine3.96.tar.gz / pine3.96.tar / pine3.96 / imap / ANSI / c-client / mail.h < prev    next >
C/C++ Source or Header  |  1996-06-03  |  27KB  |  728 lines

  1. /*
  2.  * Program:    Mailbox Access routines
  3.  *
  4.  * Author:    Mark Crispin
  5.  *        Networks and Distributed Computing
  6.  *        Computing & Communications
  7.  *        University of Washington
  8.  *        Administration Building, AG-44
  9.  *        Seattle, WA  98195
  10.  *        Internet: MRC@CAC.Washington.EDU
  11.  *
  12.  * Date:    22 November 1989
  13.  * Last Edited:    3 June 1996
  14.  *
  15.  * Copyright 1996 by the University of Washington
  16.  *
  17.  *  Permission to use, copy, modify, and distribute this software and its
  18.  * documentation for any purpose and without fee is hereby granted, provided
  19.  * that the above copyright notice appears in all copies and that both the
  20.  * above copyright notice and this permission notice appear in supporting
  21.  * documentation, and that the name of the University of Washington not be
  22.  * used in advertising or publicity pertaining to distribution of the software
  23.  * without specific, written prior permission.  This software is made
  24.  * available "as is", and
  25.  * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
  26.  * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
  27.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
  28.  * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
  29.  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  30.  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
  31.  * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
  32.  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  33.  *
  34.  */
  35.  
  36. /* Build parameters */
  37.  
  38. #define CACHEINCREMENT 100    /* cache growth increments */
  39. #define MAILTMPLEN 1024        /* size of a temporary buffer */
  40. #define MAXMESSAGESIZE 65000    /* MS-DOS: maximum text buffer size
  41.                  * other:  initial text buffer size */
  42. #define NUSERFLAGS 30        /* # of user flags (current servers 30 max) */
  43. #define BASEYEAR 1969        /* the year time began */
  44.                 /* default for unqualified addresses */
  45. #define BADHOST ".MISSING-HOST-NAME."
  46.  
  47.  
  48. /* Constants */
  49.  
  50. #define NIL 0            /* convenient name */
  51. #define T 1            /* opposite of NIL */
  52. #define LONGT (long) 1        /* long T */
  53.  
  54. #define WARN (long) 1        /* mm_log warning type */
  55. #define ERROR (long) 2        /* mm_log error type */
  56. #define PARSE (long) 3        /* mm_log parse error type */
  57. #define BYE (long) 4        /* mm_notify stream dying */
  58.  
  59. #define DELIM '\377'        /* strtok delimiter character */
  60.  
  61. /* Global and Driver Parameters */
  62.  
  63.     /* 1xx: c-client globals */
  64. #define GET_DRIVERS (long) 101
  65. #define SET_DRIVERS (long) 102
  66. #define GET_GETS (long) 103
  67. #define SET_GETS (long) 104
  68. #define GET_CACHE (long) 105
  69. #define SET_CACHE (long) 106
  70. #define GET_USERNAMEBUF (long) 107
  71. #define SET_USERNAMEBUF (long) 108
  72.     /* 2xx: environment */
  73. #define GET_USERNAME (long) 201
  74. #define SET_USERNAME (long) 202
  75. #define GET_HOMEDIR (long) 203
  76. #define SET_HOMEDIR (long) 204
  77. #define GET_LOCALHOST (long) 205
  78. #define SET_LOCALHOST (long) 206
  79. #define GET_SYSINBOX (long) 207
  80. #define SET_SYSINBOX (long) 208
  81.     /* 3xx: TCP/IP */
  82. #define GET_OPENTIMEOUT (long) 300
  83. #define SET_OPENTIMEOUT (long) 301
  84. #define GET_READTIMEOUT (long) 302
  85. #define SET_READTIMEOUT (long) 303
  86. #define GET_WRITETIMEOUT (long) 304
  87. #define SET_WRITETIMEOUT (long) 305
  88. #define GET_CLOSETIMEOUT (long) 306
  89. #define SET_CLOSETIMEOUT (long) 307
  90. #define GET_TIMEOUT (long) 308
  91. #define SET_TIMEOUT (long) 309
  92. #define GET_RSHTIMEOUT (long) 310
  93. #define SET_RSHTIMEOUT (long) 311
  94.     /* 4xx: network drivers */
  95. #define GET_MAXLOGINTRIALS (long) 400
  96. #define SET_MAXLOGINTRIALS (long) 401
  97. #define GET_LOOKAHEAD (long) 402
  98. #define SET_LOOKAHEAD (long) 403
  99. #define GET_IMAPPORT (long) 404
  100. #define SET_IMAPPORT (long) 405
  101. #define GET_PREFETCH (long) 406
  102. #define SET_PREFETCH (long) 407
  103. #define GET_LOGINFULLNAME (long) 408
  104. #define SET_LOGINFULLNAME (long) 409
  105. #define GET_CLOSEONERROR (long) 410
  106. #define SET_CLOSEONERROR (long) 411
  107. #define GET_POP3PORT (long) 412
  108. #define SET_POP3PORT (long) 413
  109.     /* 5xx: local file drivers */
  110. #define GET_MBXPROTECTION (long) 500
  111. #define SET_MBXPROTECTION (long) 501
  112. #define GET_SUBPROTECTION (long) 502
  113. #define SET_SUBPROTECTION (long) 503
  114. #define GET_LOCKPROTECTION (long) 504
  115. #define SET_LOCKPROTECTION (long) 505
  116. #define GET_FROMWIDGET (long) 506
  117. #define SET_FROMWIDGET (long) 507
  118. #define GET_NEWSACTIVE (long) 508
  119. #define SET_NEWSACTIVE (long) 509
  120. #define GET_NEWSSPOOL (long) 510
  121. #define SET_NEWSSPOOL (long) 511
  122. #define GET_NEWSRC (long) 512
  123. #define SET_NEWSRC (long) 513
  124. #define GET_EXTENSION (long) 514
  125. #define SET_EXTENSION (long) 515
  126. #define GET_DISABLEFCNTLLOCK (long) 516
  127. #define SET_DISABLEFCNTLLOCK (long) 517
  128. #define GET_LOCKEACCESERROR (long) 518
  129. #define SET_LOCKEACCESERROR (long) 519
  130.     /* 6xx: posting parameters */
  131. #define    GET_RFC822OUTPUT (long) 600
  132. #define    SET_RFC822OUTPUT (long) 601
  133. #define    GET_POSTVERBOSE (long) 602
  134. #define    SET_POSTVERBOSE (long) 603
  135. #define    GET_POSTSOUTR (long) 604
  136. #define    SET_POSTSOUTR (long) 605
  137. #define    GET_POSTGETLINE (long) 606
  138. #define    SET_POSTGETLINE (long) 607
  139. #define    GET_POSTCLOSE (long) 608
  140. #define    SET_POSTCLOSE (long) 609
  141.  
  142. /* Open options */
  143.  
  144. #define OP_DEBUG (long) 1    /* debug protocol negotiations */
  145. #define OP_READONLY (long) 2    /* read-only open */
  146. #define OP_ANONYMOUS (long) 4    /* anonymous open of newsgroup */
  147. #define OP_SHORTCACHE (long) 8    /* short (elt-only) caching */
  148. #define OP_SILENT (long) 16    /* don't pass up events (internal use) */
  149. #define OP_PROTOTYPE (long) 32    /* return driver prototype */
  150. #define OP_HALFOPEN (long) 64    /* half-open (IMAP connect but no select) */
  151.  
  152.  
  153. /* Cache management function codes */
  154.  
  155. #define CH_INIT (long) 10    /* initialize cache */
  156. #define CH_SIZE (long) 11    /* (re-)size the cache */
  157. #define CH_MAKELELT (long) 20    /* return long elt, make if needed */
  158. #define CH_LELT (long) 21    /* return long elt if exists */
  159. #define CH_MAKEELT (long) 30    /* return short elt, make if needed */
  160. #define CH_ELT (long) 31    /* return short elt if exists */
  161. #define CH_FREE (long) 40    /* free space used by elt */
  162. #define CH_EXPUNGE (long) 45    /* delete elt pointer from list */
  163.  
  164.  
  165. /* Garbage collection flags */
  166.  
  167. #define GC_ELT (long) 1        /* message cache elements */
  168. #define GC_ENV (long) 2        /* envelopes and bodies */
  169. #define GC_TEXTS (long) 4    /* cached texts */
  170.  
  171. /* Message structures */
  172.  
  173.  
  174. /* Item in an address list */
  175.     
  176. #define ADDRESS struct mail_address
  177. ADDRESS {
  178.   char *personal;        /* personal name phrase */
  179.   char *adl;            /* at-domain-list source route */
  180.   char *mailbox;        /* mailbox name */
  181.   char *host;            /* domain name of mailbox's host */
  182.   char *error;            /* error in address from SMTP module */
  183.   ADDRESS *next;        /* pointer to next address in list */
  184. };
  185.  
  186.  
  187. /* Message envelope */
  188.  
  189. typedef struct mail_envelope {
  190.   char *remail;            /* remail header if any */
  191.   ADDRESS *return_path;        /* error return address */
  192.   char *date;            /* message composition date string */
  193.   ADDRESS *from;        /* originator address list */
  194.   ADDRESS *sender;        /* sender address list */
  195.   ADDRESS *reply_to;        /* reply address list */
  196.   char *subject;        /* message subject string */
  197.   ADDRESS *to;            /* primary recipient list */
  198.   ADDRESS *cc;            /* secondary recipient list */
  199.   ADDRESS *bcc;            /* blind secondary recipient list */
  200.   char *in_reply_to;        /* replied message ID */
  201.   char *message_id;        /* message ID */
  202.   char *newsgroups;        /* USENET newsgroups */
  203.   char *followup_to;        /* USENET reply newsgroups */
  204.   char *references;        /* USENET references */
  205. } ENVELOPE;
  206.  
  207. /* Primary body types */
  208. /* If you change any of these you must also change body_types in rfc822.c */
  209.  
  210. extern char *body_types[];    /* defined body type strings */
  211.  
  212. #define TYPETEXT 0        /* unformatted text */
  213. #define TYPEMULTIPART 1        /* multiple part */
  214. #define TYPEMESSAGE 2        /* encapsulated message */
  215. #define TYPEAPPLICATION 3    /* application data */
  216. #define TYPEAUDIO 4        /* audio */
  217. #define TYPEIMAGE 5        /* static image */
  218. #define TYPEVIDEO 6        /* video */
  219. #define TYPEOTHER 7        /* unknown */
  220. #define TYPEMAX 15        /* maximum type code */
  221.  
  222.  
  223. /* Body encodings */
  224. /* If you change any of these you must also change body_encodings in rfc822.c
  225.  */
  226.  
  227. extern char *body_encodings[];    /* defined body encoding strings */
  228.  
  229. #define ENC7BIT 0        /* 7 bit SMTP semantic data */
  230. #define ENC8BIT 1        /* 8 bit SMTP semantic data */
  231. #define ENCBINARY 2        /* 8 bit binary data */
  232. #define ENCBASE64 3        /* base-64 encoded data */
  233. #define ENCQUOTEDPRINTABLE 4    /* human-readable 8-as-7 bit data */
  234. #define ENCOTHER 5        /* unknown */
  235. #define ENCMAX 10        /* maximum encoding code */
  236.  
  237.  
  238. /* Body contents */
  239.  
  240. #define BINARY void
  241. #define BODY struct mail_body
  242. #define MESSAGE struct mail_body_message
  243. #define PARAMETER struct mail_body_parameter
  244. #define PART struct mail_body_part
  245.  
  246. /* Message content (ONLY for parsed messages) */
  247.  
  248. MESSAGE {
  249.   ENVELOPE *env;        /* message envelope */
  250.   BODY *body;            /* message body */
  251.   char *text;            /* message in RFC-822 form */
  252.   unsigned long offset;        /* offset of text from header */
  253. };
  254.  
  255.  
  256. /* Parameter list */
  257.  
  258. PARAMETER {
  259.   char *attribute;        /* parameter attribute name */
  260.   char *value;            /* parameter value */
  261.   PARAMETER *next;        /* next parameter in list */
  262. };
  263.  
  264.  
  265. /* Message body structure */
  266.  
  267. BODY {
  268.   unsigned short type;        /* body primary type */
  269.   unsigned short encoding;    /* body transfer encoding */
  270.   char *subtype;        /* subtype string */
  271.   PARAMETER *parameter;        /* parameter list */
  272.   char *id;            /* body identifier */
  273.   char *description;        /* body description */
  274.   union {            /* different ways of accessing contents */
  275.     unsigned char *text;    /* body text (+ enc. message in composing) */
  276.     BINARY *binary;        /* body binary */
  277.     PART *part;            /* body part list */
  278.     MESSAGE msg;        /* body encapsulated message (PARSE ONLY) */
  279.   } contents;
  280.   struct {
  281.     unsigned long lines;    /* size in lines */
  282.     unsigned long bytes;    /* size in bytes */
  283.     unsigned long ibytes;    /* internal size in bytes (drivers ONLY!!) */
  284.   } size;
  285.   char *md5;            /* MD5 checksum */
  286. };
  287.  
  288.  
  289. /* Multipart content list */
  290.  
  291. PART {
  292.   BODY body;            /* body information for this part */
  293.   unsigned long offset;        /* offset from body origin */
  294.   PART *next;            /* next body part */
  295. };
  296.  
  297. /* Entry in the message cache array */
  298.  
  299. typedef struct message_cache {
  300.   unsigned long msgno;        /* message number */
  301.   /* The next 8 bytes is ordered in this way so that it will be reasonable even
  302.    * on a 36-bit machine.  Maybe someday I'll port this to TOPS-20.  ;-)
  303.    */
  304.             /* internal time/zone, system flags (4 bytes) */
  305.   unsigned int hours: 5;    /* hours (0-23) */
  306.   unsigned int minutes: 6;    /* minutes (0-59) */
  307.   unsigned int seconds: 6;    /* seconds (0-59) */
  308.   /* It may seem easier to have zhours be signed.  Unfortunately, a certain
  309.    * cretinous C compiler from a well-known software vendor in Redmond, WA
  310.    * does not allow signed bit fields.
  311.    */
  312.   unsigned int zoccident : 1;    /* non-zero if west of UTC */
  313.   unsigned int zhours : 4;    /* hours from UTC (0-12) */
  314.   unsigned int zminutes: 6;    /* minutes (0-59) */
  315.   unsigned int seen : 1;    /* system Seen flag */
  316.   unsigned int deleted : 1;    /* system Deleted flag */
  317.   unsigned int flagged : 1;     /* system Flagged flag */
  318.   unsigned int answered : 1;    /* system Answered flag */
  319.             /* flags, lock count (2 bytes) */
  320.   unsigned int xxxx : 1;    /* system flag reserved for future */
  321.   unsigned int valid : 1;    /* elt has valid flags */
  322.   unsigned int recent : 1;    /* message is new as of this mailbox open */
  323.   unsigned int searched : 1;    /* message was searched */
  324.   unsigned int sequence : 1;    /* (driver use) message is in sequence */
  325.   unsigned int spare : 1;    /* reserved for use by main program */
  326.   unsigned int spare2 : 1;    /* reserved for use by main program */
  327.   unsigned int spare3 : 1;    /* reserved for use by main program */
  328.   unsigned int lockcount : 8;    /* non-zero if multiple references */
  329.             /* internal date (2 bytes) */
  330.   unsigned int day : 5;        /* day of month (1-31) */
  331.   unsigned int month : 4;    /* month of year (1-12) */
  332.   unsigned int year : 7;    /* year since 1969 (expires 2097) */
  333.   unsigned long user_flags;    /* user-assignable flags */
  334.   unsigned long rfc822_size;    /* # of bytes of message as raw RFC822 */
  335.   unsigned long data1;        /* (driver use) first data item */
  336.   unsigned long data2;        /* (driver use) second data item */
  337. } MESSAGECACHE;
  338.  
  339.  
  340. typedef struct long_cache {
  341.   MESSAGECACHE elt;
  342.   ENVELOPE *env;        /* pointer to message envelope */
  343.   BODY *body;            /* pointer to message body */
  344. } LONGCACHE;
  345.  
  346. /* String structure */
  347.  
  348. #define STRINGDRIVER struct string_driver
  349.  
  350. typedef struct mailstring {
  351.   void *data;            /* driver-dependent data */
  352.   unsigned long data1;        /* driver-dependent data */
  353.   unsigned long size;        /* total length of string */
  354.   char *chunk;            /* base address of chunk */
  355.   unsigned long chunksize;    /* size of chunk */
  356.   unsigned long offset;        /* offset of this chunk in base */
  357.   char *curpos;            /* current position in chunk */
  358.   unsigned long cursize;    /* number of bytes remaining in chunk */
  359.   STRINGDRIVER *dtb;        /* driver that handles this type of string */
  360. } STRING;
  361.  
  362.  
  363. /* Dispatch table for string driver */
  364.  
  365. STRINGDRIVER {
  366.                 /* initialize string driver */
  367.   void (*init) (STRING *s,void *data,unsigned long size);
  368.                 /* get next character in string */
  369.   char (*next) (STRING *s);
  370.                 /* set position in string */
  371.   void (*setpos) (STRING *s,unsigned long i);
  372. };
  373.  
  374.  
  375. /* Stringstruct access routines */
  376.  
  377. #define INIT(s,d,data,size) ((*((s)->dtb = &d)->init) (s,data,size))
  378. #define SIZE(s) ((s)->size - GETPOS (s))
  379. #define CHR(s) (*(s)->curpos)
  380. #define SNX(s) (--(s)->cursize ? *(s)->curpos++ : (*(s)->dtb->next) (s))
  381. #define GETPOS(s) ((s)->offset + ((s)->curpos - (s)->chunk))
  382. #define SETPOS(s,i) (*(s)->dtb->setpos) (s,i)
  383.  
  384. /* Mail Access I/O stream */
  385.  
  386.  
  387. /* Structure for mail driver dispatch */
  388.  
  389. #define DRIVER struct driver    
  390.  
  391.  
  392. /* Mail I/O stream */
  393.     
  394. typedef struct mail_stream {
  395.   DRIVER *dtb;            /* dispatch table for this driver */
  396.   void *local;            /* pointer to driver local data */
  397.   char *mailbox;        /* mailbox name */
  398.   unsigned int lock : 1;    /* stream lock flag */
  399.   unsigned int debug : 1;    /* stream debug flag */
  400.   unsigned int silent : 1;    /* silent stream from Tenex */
  401.   unsigned int rdonly : 1;    /* stream read-only flag */
  402.   unsigned int anonymous : 1;    /* stream anonymous access flag */
  403.   unsigned int scache : 1;    /* stream short cache flag */
  404.   unsigned int halfopen : 1;    /* stream half-open flag */
  405.   unsigned short use;        /* stream use count */
  406.   unsigned short sequence;    /* stream sequence */
  407.   unsigned long gensym;        /* generated tag */
  408.   unsigned long nmsgs;        /* # of associated msgs */
  409.   unsigned long recent;        /* # of recent msgs */
  410.   char *flagstring;        /* buffer of user keyflags */
  411.   char *user_flags[NUSERFLAGS];    /* pointers to user flags in bit order */
  412.   unsigned long cachesize;    /* size of message cache */
  413.   union {
  414.     void **c;            /* to get at the cache in general */
  415.     MESSAGECACHE **s;        /* message cache array */
  416.     LONGCACHE **l;        /* long cache array */
  417.   } cache;
  418.   unsigned long msgno;        /* message number of `current' message */
  419.   ENVELOPE *env;        /* pointer to `current' message envelope */
  420.   BODY *body;            /* pointer to `current' message body */
  421.   char *text;            /* pointer to `current' text */
  422. } MAILSTREAM;
  423.  
  424.  
  425. /* Mail I/O stream handle */
  426.  
  427. typedef struct mail_stream_handle {
  428.   MAILSTREAM *stream;        /* pointer to mail stream */
  429.   unsigned short sequence;    /* sequence of what we expect stream to be */
  430. } MAILHANDLE;
  431.  
  432. /* Mail driver dispatch */
  433.  
  434. DRIVER {
  435.   char *name;            /* driver name */
  436.   DRIVER *next;            /* next driver */
  437.                 /* mailbox is valid for us */
  438.   DRIVER *(*valid) (char *mailbox);
  439.                 /* manipulate driver parameters */
  440.   void *(*parameters) (long function,void *value);
  441.                 /* find mailboxes */
  442.   void (*find) (MAILSTREAM *stream,char *pat);
  443.                 /* find bboards */
  444.   void (*find_bboard) (MAILSTREAM *stream,char *pat);
  445.                 /* find all mailboxes */
  446.   void (*find_all) (MAILSTREAM *stream,char *pat);
  447.                 /* find all bboards */
  448.   void (*find_all_bboard) (MAILSTREAM *stream,char *pat);
  449.                 /* subscribe to mailbox */
  450.   long (*subscribe) (MAILSTREAM *stream,char *mailbox);
  451.                 /* unsubscribe from mailbox */
  452.   long (*unsubscribe) (MAILSTREAM *stream,char *mailbox);
  453.                 /* subscribe to bboard */
  454.   long (*subscribe_bboard) (MAILSTREAM *stream,char *mailbox);
  455.                 /* unsubscribe to bboard */
  456.   long (*unsubscribe_bboard) (MAILSTREAM *stream,char *mailbox);
  457.                 /* create mailbox */
  458.   long (*create) (MAILSTREAM *stream,char *mailbox);
  459.                 /* delete mailbox */
  460.   long (*mbxdel) (MAILSTREAM *stream,char *mailbox);
  461.                 /* rename mailbox */
  462.   long (*mbxren) (MAILSTREAM *stream,char *old,char *new);
  463.  
  464.                 /* open mailbox */
  465.   MAILSTREAM *(*open) (MAILSTREAM *stream);
  466.                 /* close mailbox */
  467.   void (*close) (MAILSTREAM *stream);
  468.                 /* fetch message "fast" attributes */
  469.   void (*fetchfast) (MAILSTREAM *stream,char *sequence);
  470.                 /* fetch message flags */
  471.   void (*fetchflags) (MAILSTREAM *stream,char *sequence);
  472.                 /* fetch message envelopes */
  473.   ENVELOPE *(*fetchstructure) (MAILSTREAM *stream,long msgno,BODY **body);
  474.                 /* fetch message header only */
  475.   char *(*fetchheader) (MAILSTREAM *stream,long msgno);
  476.                 /* fetch message body only */
  477.   char *(*fetchtext) (MAILSTREAM *stream,long msgno);
  478.                 /* fetch message body section */
  479.   char *(*fetchbody) (MAILSTREAM *stream,long m,char *sec,unsigned long* len);
  480.                 /* set message flag */
  481.   void (*setflag) (MAILSTREAM *stream,char *sequence,char *flag);
  482.                 /* clear message flag */
  483.   void (*clearflag) (MAILSTREAM *stream,char *sequence,char *flag);
  484.                 /* search for message based on criteria */
  485.   void (*search) (MAILSTREAM *stream,char *criteria);
  486.                 /* ping mailbox to see if still alive */
  487.   long (*ping) (MAILSTREAM *stream);
  488.                 /* check for new messages */
  489.   void (*check) (MAILSTREAM *stream);
  490.                 /* expunge deleted messages */
  491.   void (*expunge) (MAILSTREAM *stream);
  492.                 /* copy messages to another mailbox */
  493.   long (*copy) (MAILSTREAM *stream,char *sequence,char *mailbox);
  494.                 /* move messages to another mailbox */
  495.   long (*move) (MAILSTREAM *stream,char *sequence,char *mailbox);
  496.                 /* append string message to mailbox */
  497.   long (*append) (MAILSTREAM *stream,char *mailbox,char *flags,char *date,
  498.           STRING *message);
  499.                 /* garbage collect stream */
  500.   void (*gc) (MAILSTREAM *stream,long gcflags);
  501. };
  502.  
  503.  
  504. /* Parse results from mail_valid_net_parse */
  505.  
  506. #define MAXSRV 20
  507. typedef struct net_mailbox {
  508.   char host[MAILTMPLEN];    /* host name */
  509.   char mailbox[MAILTMPLEN];    /* mailbox name */
  510.   char service[MAXSRV+1];    /* service name */
  511.   long port;            /* TCP port number */
  512.   unsigned int anoflag : 1;    /* anonymous */
  513.   unsigned int bbdflag : 1;    /* bboard flag */
  514.   unsigned int dbgflag : 1;    /* debug flag */
  515. } NETMBX;
  516.  
  517. /* Other symbols */
  518.  
  519. extern const char *days[];    /* day name strings */
  520. extern const char *months[];    /* month name strings */
  521.  
  522.  
  523. /* Jacket into external interfaces */
  524.  
  525. typedef long (*readfn_t) (void *stream,unsigned long size,char *buffer);
  526. typedef char *(*mailgets_t) (readfn_t f,void *stream,unsigned long size);
  527. typedef void *(*mailcache_t) (MAILSTREAM *stream,long msgno,long op);
  528. typedef long (*tcptimeout_t) (long time);
  529. typedef long (*postsoutr_t) (void *stream,char *string);
  530. typedef char *(*postgetline_t) (void *stream);
  531. typedef void (*postclose_t) (void *stream);
  532. typedef void (*postverbose_t) (char *buffer);
  533.  
  534. #include "linkage.h"
  535.  
  536. /* Coddle certain compilers' 6-character symbol limitation */
  537.  
  538. #ifdef __COMPILER_KCC__
  539. #define mm_gets mmgets
  540. #define mm_cache mmcach
  541. #define mm_searched mmsrhd
  542. #define mm_exists mmexst
  543. #define mm_expunged mmexpn
  544. #define mm_flags mmflag
  545. #define mm_notify mmntfy
  546. #define mm_mailbox mmmlbx
  547. #define mm_bboard mmbbrd
  548. #define mm_log mmlog
  549. #define mm_dlog mmdlog
  550. #define mm_login mmlogn
  551. #define mm_critical mmcrit
  552. #define mm_nocritical mmncrt
  553. #define mm_diskerror mmderr
  554. #define mm_fatal mmfatl
  555. #define mail_string mstr
  556. #define mail_string_init mstrin
  557. #define mail_string_next mstrnx
  558. #define mail_string_setpos mstrsp
  559. #define mail_link mllink
  560. #define mail_parameters mlparm
  561. #define mail_find mlfind
  562. #define mail_find_bboards mlfndb
  563. #define mail_find_all mlfnam
  564. #define mail_find_all_bboard mlfalb
  565. #define mail_valid mlvali
  566. #define mail_valid_net mlvaln
  567. #define mail_valid_net_parse mlvlnp
  568. #define mail_subscribe mlsub
  569. #define mail_unsubscribe mlusub
  570. #define mail_subscribe_bboard mlsubb
  571. #define mail_unsubscribe_bboard mlusbb
  572. #define mail_create mlcret
  573. #define mail_delete mldele
  574. #define mail_rename mlrena
  575. #define mail_open mlopen
  576. #define mail_close mlclse
  577. #define mail_makehandle mlmkha
  578. #define mail_free_handle mlfrha
  579. #define mail_stream mlstrm
  580. #define mail_fetchfast mlffst
  581. #define mail_fetchflags mlfflg
  582. #define mail_fetchstructure mlfstr
  583. #define mail_fetchheader mlfhdr
  584. #define mail_fetchtext mlftxt
  585. #define mail_fetchbody mlfbdy
  586. #define mail_fetchfrom mlffrm
  587. #define mail_fetchsubject mlfsub
  588.  
  589. #define mail_lelt mllelt
  590. #define mail_elt mlelt
  591. #define mail_setflag mlsflg
  592. #define mail_clearflag mlcflg
  593. #define mail_search mlsrch
  594. #define mail_ping mlping
  595. #define mail_check mlchck
  596. #define mail_expunge mlexpn
  597. #define mail_copy mlcopy
  598. #define mail_move mlmove
  599. #define mail_append mlappd
  600. #define mail_append_full mlapdf
  601. #define mail_gc mailgc
  602. #define mail_date mldate
  603. #define mail_cdate mlcdat
  604. #define mail_parse_date mlpdat
  605. #define mail_searched mlsrch
  606. #define mail_exists mlexist
  607. #define mail_recent mlrcnt
  608. #define mail_expunged mlexst
  609. #define mail_lock mllock
  610. #define mail_unlock mlulck
  611. #define mail_debug mldbug
  612. #define mail_nodebug mlndbg
  613. #define mail_sequence mlsequ
  614. #define mail_newenvelope mlnenv
  615. #define mail_newaddr mlnadr
  616. #define mail_newbody mlnbod
  617. #define mail_initbody mlibod
  618. #define mail_newbody_parameter mlnbpr
  619. #define mail_newbody_part mlnbpt
  620. #define mail_free_body mlfrbd
  621. #define mail_free_body_data mlfrbt
  622. #define mail_free_body_parameter mlfrbr
  623. #define mail_free_body_part mlfrbp
  624. #define mail_free_cache mlfrch
  625. #define mail_free_elt mlfrel
  626. #define mail_free_envelope mlfren
  627. #define mail_free_address mlfrad
  628. #endif
  629.  
  630. /* Function prototypes */
  631.  
  632. void mm_searched (MAILSTREAM *stream,long number);
  633. void mm_exists (MAILSTREAM *stream,long number);
  634. void mm_expunged (MAILSTREAM *stream,long number);
  635. void mm_flags (MAILSTREAM *stream,long number);
  636. void mm_notify (MAILSTREAM *stream,char *string,long errflg);
  637. void mm_mailbox (char *string);
  638. void mm_bboard (char *string);
  639. void mm_log (char *string,long errflg);
  640. void mm_dlog (char *string);
  641. void mm_login (char *host,char *user,char *pwd,long trial);
  642. void mm_critical (MAILSTREAM *stream);
  643. void mm_nocritical (MAILSTREAM *stream);
  644. long mm_diskerror (MAILSTREAM *stream,long errcode,long serious);
  645. void mm_fatal (char *string);
  646. char *mm_gets (readfn_t f,void *stream,unsigned long size);
  647. void *mm_cache (MAILSTREAM *stream,long msgno,long op);
  648.  
  649. extern STRINGDRIVER mail_string;
  650. void mail_string_init (STRING *s,void *data,unsigned long size);
  651. char mail_string_next (STRING *s);
  652. void mail_string_setpos (STRING *s,unsigned long i);
  653. void mail_link (DRIVER *driver);
  654. void *mail_parameters (MAILSTREAM *stream,long function,void *value);
  655. void mail_find (MAILSTREAM *stream,char *pat);
  656. void mail_find_bboards (MAILSTREAM *stream,char *pat);
  657. void mail_find_all (MAILSTREAM *stream,char *pat);
  658. void mail_find_all_bboard (MAILSTREAM *stream,char *pat);
  659. DRIVER *mail_valid (MAILSTREAM *stream,char *mailbox,char *purpose);
  660. DRIVER *mail_valid_net (char *name,DRIVER *drv,char *host,char *mailbox);
  661. long mail_valid_net_parse (char *name,NETMBX *mb);
  662. long mail_subscribe (MAILSTREAM *stream,char *mailbox);
  663. long mail_unsubscribe (MAILSTREAM *stream,char *mailbox);
  664. long mail_subscribe_bboard (MAILSTREAM *stream,char *mailbox);
  665. long mail_unsubscribe_bboard (MAILSTREAM *stream,char *mailbox);
  666. long mail_create (MAILSTREAM *stream,char *mailbox);
  667. long mail_delete (MAILSTREAM *stream,char *mailbox);
  668. long mail_rename (MAILSTREAM *stream,char *old,char *new);
  669. MAILSTREAM *mail_open (MAILSTREAM *oldstream,char *name,long options);
  670. MAILSTREAM *mail_close (MAILSTREAM *stream);
  671. MAILHANDLE *mail_makehandle (MAILSTREAM *stream);
  672. void mail_free_handle (MAILHANDLE **handle);
  673. MAILSTREAM *mail_stream (MAILHANDLE *handle);
  674. void mail_fetchfast (MAILSTREAM *stream,char *sequence);
  675. void mail_fetchflags (MAILSTREAM *stream,char *sequence);
  676. ENVELOPE *mail_fetchstructure (MAILSTREAM *stream,long msgno,BODY **body);
  677. char *mail_fetchheader (MAILSTREAM *stream,long msgno);
  678. char *mail_fetchtext (MAILSTREAM *stream,long msgno);
  679. char *mail_fetchbody (MAILSTREAM *stream,long m,char *sec,unsigned long *len);
  680. void mail_fetchfrom (char *s,MAILSTREAM *stream,long msgno,long length);
  681. void mail_fetchsubject (char *s,MAILSTREAM *stream,long msgno,long length);
  682. LONGCACHE *mail_lelt (MAILSTREAM *stream,long msgno);
  683. MESSAGECACHE *mail_elt (MAILSTREAM *stream,long msgno);
  684.  
  685. void mail_setflag (MAILSTREAM *stream,char *sequence,char *flag);
  686. void mail_clearflag (MAILSTREAM *stream,char *sequence,char *flag);
  687. void mail_search (MAILSTREAM *stream,char *criteria);
  688. long mail_ping (MAILSTREAM *stream);
  689. void mail_check (MAILSTREAM *stream);
  690. void mail_expunge (MAILSTREAM *stream);
  691. long mail_copy (MAILSTREAM *stream,char *sequence,char *mailbox);
  692. long mail_move (MAILSTREAM *stream,char *sequence,char *mailbox);
  693. long mail_append (MAILSTREAM *stream,char *mailbox,STRING *message);
  694. long mail_append_full (MAILSTREAM *stream,char *mailbox,char *flags,char *date,
  695.                STRING *message);
  696. void mail_gc (MAILSTREAM *stream,long gcflags);
  697. char *mail_date (char *string,MESSAGECACHE *elt);
  698. char *mail_cdate (char *string,MESSAGECACHE *elt);
  699. long mail_parse_date (MESSAGECACHE *elt,char *string);
  700. void mail_searched (MAILSTREAM *stream,long msgno);
  701. void mail_exists (MAILSTREAM *stream,long nmsgs);
  702. void mail_recent (MAILSTREAM *stream,long recent);
  703. void mail_expunged (MAILSTREAM *stream,long msgno);
  704. void mail_lock (MAILSTREAM *stream);
  705. void mail_unlock (MAILSTREAM *stream);
  706. void mail_debug (MAILSTREAM *stream);
  707. void mail_nodebug (MAILSTREAM *stream);
  708. long mail_sequence (MAILSTREAM *stream,char *sequence);
  709. ENVELOPE *mail_newenvelope (void);
  710. ADDRESS *mail_newaddr (void);
  711. BODY *mail_newbody (void);
  712. BODY *mail_initbody (BODY *body);
  713. PARAMETER *mail_newbody_parameter (void);
  714. PART *mail_newbody_part (void);
  715. void mail_free_body (BODY **body);
  716. void mail_free_body_data (BODY *body);
  717. void mail_free_body_parameter (PARAMETER **parameter);
  718. void mail_free_body_part (PART **part);
  719. void mail_free_cache (MAILSTREAM *stream);
  720. void mail_free_elt (MESSAGECACHE **elt);
  721. void mail_free_lelt (LONGCACHE **lelt);
  722. void mail_free_envelope (ENVELOPE **env);
  723. void mail_free_address (ADDRESS **address);
  724.  
  725. long sm_subscribe (char *mailbox);
  726. long sm_unsubscribe (char *mailbox);
  727. char *sm_read (void **sdb);
  728.